//
// Created by HP on 2021/12/26.
//

#ifndef SPH_SPH_MATH_H
#define SPH_SPH_MATH_H

#include <cmath>

#define PI ((double) 3.14159265358979323846)

struct Vec2 {
    double x;
    double y;
    double module() const;
    double operator*(const Vec2& other)  const;
    bool   operator==(const Vec2& other) const;
    Vec2   operator*(double scale)       const;
    Vec2   operator-(const Vec2& other)  const;
    Vec2   operator+(const Vec2& other)  const;
};

const Vec2 g = Vec2 {.x = 0, .y = 9.8 * 0.008};

/**
 * 根据光滑核函数 W_Poly6 计算流体中坐标为 i 处的密度, 注意这只是其中的一项
 * @param i 坐标 i
 * @param j 坐标 j
 * @param h 光滑核半径 h
 * @return  i 处密度的一项
 */
double density(const Vec2& i, const Vec2& j, double h);

/**
 * 根据光滑核函数 W_Spiky 计算流体中坐标为 i 处的压力产生的加速度, 注意这只是其中的一项
 * @param i 坐标 i
 * @param j 坐标 j
 * @param h 光滑核半径 h
 * @param dens_i 流体中坐标为 i 处的密度
 * @param dens_j 流体中坐标为 j 处的密度
 * @param dens_0 流体静止时的密度
 * @param K 理想状态气体方程中的常数
 * @return i 处的压力产生的加速度的一项
 */
Vec2 a_pressure(const Vec2& i, const Vec2& j, double h,
                double dens_i, double dens_j, double dens_0, double K);

/**
 * 根据光滑核函数 W_Viscosity 计算流体中坐标为 i 处的流体粘度产生的加速度, 注意这只是其中的一项
 * @param i 坐标 i
 * @param j 坐标 j
 * @param vi 流体中坐标为 i 处的速度
 * @param vj 流体中坐标为 j 处的速度
 * @param dens_i 流体中坐标为 i 处的密度
 * @param dens_j 流体中坐标为 j 处的密度
 * @param h 光滑核半径 h
 * @return i 处的粘度产生的加速度的一项
 */
Vec2 a_viscosity(const Vec2& i, const Vec2& j, const Vec2& vi, const Vec2& vj,
                 double dens_i, double dens_j, double h);

#endif //SPH_SPH_MATH_H
